// import com.alibaba.druid.DbType*;
// import com.alibaba.druid.FastsqlException;
// import com.alibaba.druid.sql.ast.SQLCommentHint*;
// import com.alibaba.druid.sql.ast.SQLExpr*;
// import com.alibaba.druid.sql.ast.SQLName*;
// import com.alibaba.druid.sql.ast.SQLStatementImpl;
// import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
// import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
// import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor*;

// import java.io.IOException;
// import java.util.ArrayList;
// import java.util.std::list;
#pragma once
#include <list>
#include "../../../sql/ast/SQLStatementImpl.h"
#include <sstream>
class SQLAssignItem;
class SQLCommentHint;
class DbType;
class SQLExpr;
class SQLName;
class SQLASTVisitor;

class SQLSetStatement_Option
{
public:
  static SQLSetStatement_Option_ptr IDENTITY_INSERT;
  static SQLSetStatement_Option_ptr PASSWORD; // mysql
  static SQLSetStatement_Option_ptr GLOBAL;
  static SQLSetStatement_Option_ptr SESSION;
  static SQLSetStatement_Option_ptr LOCAL;
  static SQLSetStatement_Option_ptr PROJECT;
  string_ptr name;
  uint64_t mask;
  SQLSetStatement_Option(uint64_t mask, string_ptr name);
};

class SQLSetStatement :virtual  public SQLStatementImpl
{
public:
  std::shared_ptr<SQLSetStatement_Option> option;

  SQLAssignItem_list_ptr items;

  SQLCommentHint_list_ptr hints;

  SQLSetStatement();

  SQLSetStatement(DbType_ptr dbType);

  SQLSetStatement(SQLExpr_ptr target, SQLExpr_ptr value);

  SQLSetStatement(SQLExpr_ptr target, SQLExpr_ptr value, DbType_ptr dbType);
  SHAREDOBJECT(SQLSetStatement);

  static SQLSetStatement *plus(SQLName_ptr target);

  SQLAssignItem_list_ptr getItems();

  void setItems(SQLAssignItem_list_ptr items);

  SQLCommentHint_list_ptr getHints();

  void setHints(SQLCommentHint_list_ptr hints);

  std::shared_ptr<SQLSetStatement_Option> getOption();

  void setOption(std::shared_ptr<SQLSetStatement_Option> option);

  void set(SQLExpr_ptr target, SQLExpr_ptr value);

  //@Override
  void accept0(SQLASTVisitor_ptr visitor);

  void output(std::stringstream * buf);

  virtual SQLObject_ptr clone();
  SQLAssignItem_list_ptr getChildren();
};
